#pragma once

#include  "iostream"
#include  "vector"
#include  "stack"
#include  "unordered_map"
#include   "queue"

using namespace std;


string removeDuplicateLetters(string s) {

    unordered_map<char, int> mp;
    for (int i = 0; i < s.size(); ++i) {
        ++mp[s[i]];
    }
    int used[27] = {0};

    stack<char> st;
    string res;

    for (int i = 0; i < s.size(); ++i) {
        --mp[s[i]];//不管怎么样这个字符都不会在操作了 直接这边减去就行了

        if (used[s[i] - 'a'] == 1)
            continue;//这边被使用直接跳过就行 例如这种 abca 最后那个a再出现不会对前面的造成改变
        //就是如果push到栈里面了且不是头部 那就没法改了 也不用改

        // -->
        if (st.empty()) {
            //栈为null 直接push 进去就行
            st.push(s[i]);
            res.push_back(s[i]);
            used[s[i] - 'a'] = 1;
        } else {
            while (!st.empty() && st.top() > s[i]) {
                //如果就一个栈顶 那不用pop
                //md 刚才这边一直用count 计数 我傻逼了
                if (mp[st.top()] <= 0)
                    break;

                auto c = st.top();
                st.pop();
                res.pop_back();
                //设置为0
                used[c - 'a'] = 0;
            }

            st.push(s[i]);
            res.push_back(s[i]);
            used[s[i] - 'a'] = 1;

        }


    }


    return res;

}